Lesson 4: An html form with data, without getters or setters

For the form field named "yourName" in the previous lesson, we also had to create the getters and setters getYourName() and setYourName() in the action, as well as the private variable yourName. With dozens of forms and hundreds of form fields, you'll be typing thousands of getters and setters. That can get old fast. In this lesson, we'll repeat the last lesson, but without any of that extra typing.

1. Create the html form

Use the same JSP form from the previous lesson, but change the form action to page04.action:

<html>
<head>
	<title>A simple form with data</title>
</head>
<body>
	<p>What is your name?</p>

	<form action="form04.action" method="post">
		<p><input type="text" name="yourName"></p>
		<p><input type="submit" value="Submit your name." /></p>
	</form>

</body>
</html>

2. Create the form action

Paste this code into [src]/lessons/Form04Action.java:

package lessons;

import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.webwork.interceptor.ParameterAware;

import java.util.Map;

public class Form04Action extends ActionSupport implements ParameterAware {

  Map parameters;

  public Map getParameters() {
    return parameters;
  }

  public void setParameters(Map parameters) {
    this.parameters = parameters;
  }

  public String execute() {
    String[] yourName = (String[]) parameters.get("yourName");
    if(yourName == null || yourName[0] == null || yourName[0].length() == 0)
      return ERROR;
    else
      return SUCCESS;
  }
}

Register the action in xwork.xml:

Edit [webapp]/WEB-INF/classes/xwork.xml:

<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
  <!-- Include webwork defaults (from WebWork JAR). -->
  <include file="webwork-default.xml" />
  
  <!-- Configuration for the default package. -->
  <package name="default" extends="webwork-default">
    <!-- Default interceptor stack. --> 
    <default-interceptor-ref name="defaultStack" /> 
    
    <!-- 02 --> 
    <action name="form02" class="lessons.Form02Action"> 
      <result name="success" type="dispatcher">page02-success.jsp</result> 
    </action> 

    <!-- 03 -->
    <action name="form03" class="lessons.Form03Action">
      <result name="success" type="dispatcher">page03-success.jsp</result>
      <result name="error" type="dispatcher">page03-error.jsp</result>
    </action>
    
    <!-- 04 -->
    <action name="form04" class="lessons.Form04Action">
      <result name="success" type="dispatcher">page04-success.jsp</result>
      <result name="error" type="dispatcher">page03-error.jsp</result>
      <interceptor-ref name="servlet-config"/>
    </action>

  </package>
</xwork>

Create the success and error pages

We'll use the same error page, but create a slightly different success page page04-success.jsp. The only difference is the <ww:property> tag.

<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head>
	<title>Success page for form with data</title>
</head>
<body>

Hello, <ww:property value="parameters.yourName" />!

</body>
</html>

Try it

Don't forget to compile your action to [webapp]/WEB-INF/classes, and to restart your web application if necessary.

Go ahead and try it now. Load page04.jsp, enter "Bob" in the text field, and click the form submit button. You should see page04-success.jsp saying "Hello, Bob!"

How the code works

You've probably figured out what is going on just from looking at the code.

Instead of a setter setYourName() setting a private variable yourName in the action, setParameters() magically extracts everything from the JSP request object and puts into a private local Map parameters. Then execute(), instead of looking for a yourName variable, is able to get the value of the "yourName" field from parameters. So far so good .

Back on the page04-success.jsp page, <ww:property value="yourName" /> isn't going to work any more, because there is no getYourName() getter in the action. Instead, <ww:property value="parameters.yourName" /> calls the getParameters() getter, and is able to get the value of the "yourName" field. Pretty neat!

We haven't covered how to handle radio buttons, checkboxes, and other strange html form fields. That involves dealing with the fact that every entry in the parameters Map is a String[]. We'll cover this in a later lesson.

Previous Lesson | Next Lesson